package com.bryant.demo05.ui.detail

// ============================ 该文件为MVP模式中的Model层， 主要封装数据获取逻辑 =============================

//------------------------------------------------------------------------------------------------------
import android.os.Handler
import android.os.Looper
import android.util.Log
import com.bryant.demo05.base.BaseInteractor
import com.bryant.demo05.utils.WeatherUtils
import com.qweather.sdk.Callback
import com.qweather.sdk.QWeather
import com.qweather.sdk.basic.Lang
import com.qweather.sdk.parameter.weather.WeatherParameter
import com.qweather.sdk.response.weather.WeatherDailyResponse
import com.qweather.sdk.basic.Unit
import com.qweather.sdk.response.error.ErrorResponse

class WeatherDetailInteractor : BaseInteractor<WeatherDetailView>() {
    // 获取3天天气数据接口 - 获取成功时调用 get3DayWeatherSuccess()，失败时调用 get3DayWeatherFailure()
    interface Get3DayWeatherCallBack {
        // 获取3天天气成功
        fun get3DayWeatherSuccess(weather: WeatherDailyResponse)

        // 获取3天天气失败
        fun get3DayWeatherFailure(error: String)
    }

    // 封装获取3天天气数据方法 - 通过请求获取 - 参数：经纬度，回调接口
    fun get3DayWeather(latitude: String, longitude: String, callback: Get3DayWeatherCallBack) {
        Log.d("get3DayWeather", "latitude: $latitude, longitude: $longitude")
        // 1. ------------  构造天气API所需的经纬度参数字符串，格式为"经度,纬度"
        var tempParam =
            WeatherUtils.formatLatLng(longitude) + "," + WeatherUtils.formatLatLng(latitude)
        // 2. ---------------- 创建天气参数对象，调用WeatherParameter设置好参数 ----------
        val parameter = WeatherParameter(tempParam)
            .lang(Lang.ZH_HANS)
            .unit(Unit.METRIC)

        // ----------------  3. 发送请求 - 使用和风天气SDK发起3天天气预报请求并处理响应结果的核心实现

       /*   1. 调用和风天气SDK的 weather3d 接口获取3天天气预报
          2. 传入之前构建好的 parameter 参数对象
          3. 第二个参数是匿名内部类实现的 Callback<WeatherDailyResponse> 回调接口
        */

        QWeather.instance.weather3d(parameter, object : Callback<WeatherDailyResponse> {

            // 成功回调处理 - 当请求成功时执行此方法
            override fun onSuccess(response: WeatherDailyResponse) {
                // 使用 Handler(Looper.getMainLooper()).post 切换到主线程
                Handler(Looper.getMainLooper()).post {
                    // 调用传入的 callback.get3DayWeatherSuccess(response) 通知上层数据获取成功
                    callback.get3DayWeatherSuccess(response)
                }
            }
            // 失败回调处理 - 当请求失败时执行此方法
            override fun onFailure(errorResponse: ErrorResponse) {
                Handler(Looper.getMainLooper()).post {
                    callback.get3DayWeatherFailure(errorResponse.toString())
                }
            }
            // 异常处理
            override fun onException(e: Throwable) {
                Handler(Looper.getMainLooper()).post {
                    callback.get3DayWeatherFailure(e.toString())
                }
                e.printStackTrace()
            }
        })
    }

}
